home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / pascal / fulldb13.zip / PARSE.ASM < prev    next >
Assembly Source File  |  1991-10-15  |  2KB  |  101 lines

  1. ;    Sample assembler file for FULLDB
  2. ;
  3. ;    Assemble using
  4. ;      TASM /Zd parse
  5. ;
  6. ;    Copyright 1991, D.J. Murdoch
  7. ;    Registered users of FULLDB may use this code in their own programs.
  8.  
  9. IDEAL
  10.  
  11. SEGMENT  code BYTE PUBLIC
  12.          ASSUME cs:code
  13.  
  14.          MODEL TPASCAL
  15.  
  16. PUBLIC   WordCount
  17. PROC     WordCount FAR s:DWORD
  18.          push   ds
  19.          lds    si,[s]        ; ds:si := ^s
  20.          cld
  21.          lodsb
  22.          xor    ah,ah
  23.          mov    cx,ax         ; cx := length(s);
  24.          xor    bx,bx         ; bx := 0;
  25.          jcxz   @@done
  26.          mov    al,' '
  27.          mov    di,si
  28.          push   ds
  29.          pop    es
  30. @@whitespace:                     ; whitespace loop
  31.          repe   scasb
  32.          jcxz     @@done
  33.  
  34. @@inword:
  35.          inc    bx                ; inword loop
  36.          repne  scasb
  37.          or     cx,cx
  38.          jnz    @@whitespace
  39.  
  40. @@done:
  41.          mov    ax,bx
  42.          pop    ds
  43.          ret
  44. ENDP
  45.  
  46. PUBLIC   GetWord
  47. PROC     GetWord FAR result:DWORD,n:WORD,s:DWORD
  48.  
  49.          push   ds
  50.          les    di,[result]
  51.          xor    ax,ax
  52.          stosb                ; length(result) := 0
  53.          lds    si,[s]        ; ds:si := ^s
  54.          cld
  55.          lodsb
  56.          mov    cx,ax         ; cx := length(s);
  57.          jcxz   @@done        ; done if zero
  58.          mov    bx,[n]        ; bx := n;
  59.          mov    al,' '
  60.          mov    di,si
  61.          push   ds
  62.          pop    es
  63. @@whitespace:                     ; whitespace loop
  64.          repe   scasb
  65.          jcxz   @@done
  66.  
  67. @@inword:
  68.          dec    bx                ; inword loop
  69.          jz     @@foundit
  70.          repne  scasb
  71.          or     cx,cx
  72.          jnz    @@whitespace
  73.  
  74. @@done:
  75.          pop    ds
  76.          pop    bp                ; explicit return since we don't want
  77.          ret    6                 ; to pop the result pointer
  78.  
  79. @@foundit:
  80.          mov    si,di
  81.          dec    si                ; back up one character
  82.          inc    cx
  83.          les    di,[result]
  84.          inc    di
  85. @@loop:                           ; copy word into result
  86.          lodsb
  87.          cmp    al,' '
  88.          jz     @@gotitall
  89.          stosb
  90.          inc    bx
  91.          loop   @@loop
  92. @@gotitall:
  93.          les    di,[result]       ; set the length
  94.          mov    byte ptr es:[di],bl
  95.          jmp    @@done
  96.  
  97. ENDP
  98.  
  99. ENDS
  100. END
  101.